SportsClient copy 6.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. "use client";
  2. import { GameInfo } from "@/api/home";
  3. import { useRouter } from "@/i18n/routing";
  4. import { server } from "@/utils/client";
  5. import { useTranslations } from "next-intl";
  6. import Script from "next/script";
  7. import { FC, useEffect, useRef,useState } from "react";
  8. interface Props {
  9. brand_id: string;
  10. token: string;
  11. }
  12. // dedprz | deepwin365 | damslots | chips | deloro-casino
  13. const SportsClient: FC<Props> = (props) => {
  14. const t = useTranslations("ProfilePage");
  15. const { brand_id, token } = props;
  16. const [currentToken, setCurrentToken] = useState(token);
  17. const btRef = useRef(null);
  18. const router = useRouter();
  19. const isFreshRef = useRef(false);
  20. useEffect(() => {
  21. console.log("onLoad=====>0000");
  22. // @ts-ignore
  23. if (window.BTRenderer) {
  24. console.log("onLoad=====>1111");
  25. onLoad();
  26. }
  27. // 离开体育页的时候需要kill掉
  28. return () => {
  29. console.log("onLoad=====>killkillkillkillkill",btRef.current);
  30. if(btRef.current){
  31. // @ts-ignore
  32. btRef.current?.kill();
  33. btRef.current = null;
  34. }
  35. };
  36. }, []);
  37. useEffect(() => {
  38. console.log("onLoad=====>22222");
  39. // 如果token更新了才调用update
  40. if( currentToken !== token){
  41. console.log("onLoad=====>333333");
  42. updateToken(token);
  43. }
  44. }, [token]);
  45. const getGameDetailApi = async () => {
  46. const data = await server
  47. .request<GameInfo>({
  48. url: "/v1/api/front/game_info_by_id",
  49. method: "post",
  50. data: { id: "sportsBet", mode: 1 },
  51. })
  52. .then((res) => {
  53. if (res.code === 200) {
  54. setCurrentToken(res.data.game_url)
  55. return res.data.game_url;
  56. } else {
  57. return "";
  58. }
  59. });
  60. return data;
  61. };
  62. const updateToken = (newToken: string) => {
  63. console.log("onLoad=====>44444-0000000");
  64. // @ts-ignore
  65. if(currentToken!== newToken){
  66. console.log("onLoad=====>44444");
  67. setCurrentToken(newToken);
  68. // session失效需要重新load
  69. // @ts-ignore
  70. if (window.BTRenderer && !!isFreshRef.current) {
  71. console.log("onLoad=====>1111isFreshRef");
  72. onLoad();
  73. }else{
  74. // 多次点击当前页面只需要跳转到首页即可
  75. // 使用 updateOptions 更新当前的 BTRenderer 参数,而不是重新初始化
  76. if (btRef.current) {
  77. console.log("onLoad=====>55555");
  78. // 更新 token 和其他配置
  79. // @ts-ignore
  80. btRef.current.updateOptions({
  81. token: newToken, // 更新 token
  82. url: '/', // 更新 URL 或其他参数
  83. betSlipOffsetBottom: 80,
  84. betSlipZIndex: 1000,
  85. stickyTop: 0,
  86. betSlipOffsetTop: 50,
  87. });
  88. }
  89. }
  90. }
  91. }
  92. const onLoad = () => {
  93. // @ts-ignore
  94. const bt = new BTRenderer();
  95. btRef.current = bt;
  96. console.log("onLoad=====>666666",token);
  97. bt.initialize({
  98. brand_id: brand_id,
  99. token: token,//使用最新的token
  100. onTokenExpired: getGameDetailApi, //过期自动更新token
  101. onSessionRefresh: () => {
  102. console.log('onLoad=====>onSessionRefresh')
  103. // 销毁之前的实例并等待刷新完成
  104. if(btRef.current){
  105. console.log('onLoad=====>onSessionRefresh1111')
  106. // @ts-ignore
  107. btRef.current?.kill();
  108. }
  109. isFreshRef.current = true;
  110. console.log('onLoad=====>onSessionRefresh11112222')
  111. router.refresh()
  112. },
  113. themeName: "default",
  114. lang: "pt-br",
  115. target: document.getElementById("betby"),
  116. betSlipOffsetBottom: 80,
  117. // betSlipOffsetRight: 750,
  118. betSlipZIndex: 1000,
  119. stickyTop: 0,
  120. betSlipOffsetTop: 50,
  121. onRecharge: function () {
  122. router.push("/deposit");
  123. },
  124. onRouteChange: function () {
  125. },
  126. onLogin: function () {},
  127. onRegister: function () {},
  128. onBetSlipStateChange: function () {},
  129. });
  130. };
  131. return (
  132. <>
  133. <div id="betby" className={"h-[100%]"}></div>
  134. <Script src={"https://ui.invisiblesport.com/bt-renderer.min.js"} onLoad={onLoad} />
  135. </>
  136. );
  137. };
  138. export default SportsClient;